﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using JuegoBomberman.Controladores;
using JuegoBomberman.Vistas;
using Modelo;
using JuegoBomberman.Menu;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace JuegoBomberman.Vistas
{
    public class PartidaVista : IDibujable
    {
        private Partida Mipartida;
        Mapa mapa ;
        Bombita bombita;
        private JuegoBomberman game;
        private ContentManager content;
        private KeyboardState keyboardState;
        private KeyboardState oldKeyboardState;
        private SpriteBatch spriteBatch;
        private bool enPausa;
        private MenuPausa menuPausa;
        private List<IColisionable> enemigos;

        //Vistas
        private MapaVista mapaVista;
        private BombitaVista bombitaVista;
        private EnemigoVista enemigoVista;
        //Controladores
        private BombitaControlador bombitaControlador;
        private EnemigoControlador enemigoControlador;
        private MapaControlador mapaControlador;

        public PartidaVista(JuegoBomberman game, bool reiniciar)
        {
            this.game = game;
            this.content = game.Content;
            this.enPausa = false;
            this.Initialize();
            this.LoadContent();
        }

        private void Initialize()
        {
            this.menuPausa = new MenuPausa(this.game, this);
            Mipartida = new Partida(@"Niveles", 4);
            mapa = Mipartida.getMapaActual();
            bombita = mapa.obtenerJugador();
            enemigos = mapa.obtenerEnemigos();
            Type bomba= bombita.getBomba();


            //Inicializo las vistas
            mapaVista = new MapaVista(mapa);
            bombitaVista = new BombitaVista(bombita);
            enemigoVista = new EnemigoVista(enemigos);
            //Inicilizo los controladores
            bombitaControlador = new BombitaControlador(bombita, bombitaVista);
            enemigoControlador = new EnemigoControlador(enemigos, enemigoVista);
            mapaControlador = new MapaControlador(mapa, mapaVista);
        }
        private void Initialize(Bombita unjugador)
        {
            this.menuPausa = new MenuPausa(this.game, this);
            mapa = Mipartida.getMapaActual();
            bombita = mapa.obtenerJugador();
            enemigos = mapa.obtenerEnemigos();
            Type bomba = bombita.getBomba();


             //Inicializo las vistas
            mapaVista = new MapaVista(mapa);
            bombitaVista = new BombitaVista(unjugador);
            enemigoVista = new EnemigoVista(enemigos);
            //Inicilizo los controladores
            bombitaControlador = new BombitaControlador(bombita, bombitaVista);
            enemigoControlador = new EnemigoControlador(enemigos, enemigoVista);
            mapaControlador = new MapaControlador(mapa, mapaVista);
        }

        public void LoadContent()
        {
            Cargar(false);
        }
         
        private void Cargar(bool reiniciaNivel) {
            if (!reiniciaNivel)
            {
                spriteBatch = new SpriteBatch(game.GraphicsDevice);
                this.menuPausa.LoadContent();
            }
            mapaVista.cargarImagenes(this.content);
            bombitaVista.cargarImagenes(this.content);
            enemigoVista.cargarImagenes(this.content);
        
        }
        public void Update(GameTime gameTime)
        {
            keyboardState = Keyboard.GetState();
            if (!this.enPausa)
            {
                //Me fijo si no perdiste
                if (this.Mipartida.perdioPartida())
                {
                    this.game.MostrarGameOver();
                }
                else if (this.Mipartida.GanoPartirda())
                { 
                    //verifico si gano la partida
                    this.game.MostrarGanaste();
                }else if (this.Mipartida.GanoNivel())
                {
                    //me fijo si no ganaste
                    this.Mipartida.PasardeNivel();
                    this.Mipartida.getMapaActual().SetearJugador(bombita);
                    this.Mipartida.getMapaActual().UbicarJugador();
                    Initialize(bombita);
                    LoadContent();
                }

                //juegan los enemigos
                foreach (Enemigo enemigo in enemigos)
                {
                    //enemigoVista.cambiarImagen(typeof(enemigo).ToString());
                    enemigoControlador.Actualizarse(enemigo);
                }
                
                //Le paso el estado del teclado a los controladores
                bombitaControlador.Actualizarse(keyboardState, gameTime);
                mapaControlador.Actualizarse(gameTime.ElapsedGameTime);
            }
            else
            {
                this.menuPausa.Update(gameTime);
            }


            if(keyboardState.IsKeyDown(Keys.Escape) && oldKeyboardState.IsKeyUp(Keys.Escape))
            {
                this.enPausa = !this.enPausa;
            }

            oldKeyboardState = keyboardState;
        }

        public void SalvarPartida()
        {
            //actualizo mapa
            mapa.SetearJugador(bombita);
            Mipartida.setJugador(bombita);
            Mipartida.setMapa(mapa);
            if (File.Exists(Directory.GetCurrentDirectory() + "/Myfile.bin"))
            {
                //si ya existe una version guardada la borro.
                File.Delete(Directory.GetCurrentDirectory() + "/Myfile.bin");
            }
            //serializo
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream("MyFile.bin", FileMode.Create, FileAccess.Write, FileShare.None);
            formatter.Serialize(stream, Mipartida);
            stream.Close();
        }

        public void RecuperarPartida(JuegoBomberman game)
        {
            //valido que exista la ruta
            if (!File.Exists(Directory.GetCurrentDirectory() + "/Myfile.bin")) 
                return;
            IFormatter formatter = new BinaryFormatter();
            Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
            Mipartida = (Partida)formatter.Deserialize(stream);
            stream.Close();


            enemigos = Mipartida.getMapaActual().obtenerEnemigos();
            bombita = Mipartida.getMapaActual().obtenerJugador();
            mapa = Mipartida.getMapaActual();
            mapaVista = new MapaVista(mapa);
            bombitaVista = new BombitaVista(Mipartida.getMapaActual().obtenerJugador());
            enemigoVista = new EnemigoVista(enemigos);
            bombitaControlador = new BombitaControlador(Mipartida.getMapaActual().obtenerJugador(), bombitaVista);
            mapaControlador = new MapaControlador(mapa, mapaVista);
            enemigoControlador = new EnemigoControlador(enemigos, enemigoVista);
            Cargar(true);
        }
        public void Draw(GameTime gameTime)
        {
            if (!this.enPausa)
            {
                game.GraphicsDevice.Clear(Color.Black);
                spriteBatch.Begin();
                //Llamo a mis vistas.
                mapaVista.Dibujarse(spriteBatch);
                bombitaVista.Dibujarse(spriteBatch);
                enemigoVista.Dibujarse(spriteBatch);
                spriteBatch.End();
            }
            else
            {
                this.menuPausa.Draw(gameTime);
            }
        }

    }
}
